public class ArithmeticTest {

    // 第N个泰波那契数
    public int tribonacci(int n) {
        /**
         题目逻辑分析：
         根据现有题目的逻辑，这个序列中第n个元素的值，等于该元素前三个元素值之和
         那么我们若想求得第n个元素的值，就必须先求出n-1 n-2 n-3个元素的值，以此类推
         故可以使用动态规划的算法进行操作，因为动归的主要逻辑就是从头开始计算，并保留每次计算的值，让后面的值可以基于计算的值得出
         状态表示：
         dp[i]表示第i个 tribo序列数
         状态转移方程：
         dp[i] = dp[i-1] + dp[i-2] + dp[i-3]
         初始化：
         前三个数的值为已知，直接在dp表中赋值，下标从0开始
         注意点：
         序列从0开始，若是获取到下标为n的序列数，数组长度要为n+1
         */
        // 1 处理边界情况
        if(n == 0) {
            return 0;
        }
        if(n <= 2) {
            return 1;
        }
        // 2 对普遍情况进行处理
        // 2.1 创建dp表
        int[] dp = new int[n+1];
        // 2.2 初始化
        dp[1] = dp[2] = 1;
        // 2.3 填表
        for(int i = 3; i <= n; i++) {
            dp[i] = dp[i-1] + dp[i-2] + dp[i-3];
        }
        // 2.4 返回值
        return dp[n];
    }
}
